﻿using CodeSaude.Application.Interfaces;
using CodeSaude.Application.ViewModels;
using CodeSaude.Domain.Enums;
using CodeSaude.Infrastructure.CrossCutting.Util;
using CodeSaude.Web.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace CodeSaude.Web.Controllers
{
    public class ProcedimentoController : Controller
    {
        private readonly IProcedimentoApplicationService _procedimentoApplication;

        public ProcedimentoController(IProcedimentoApplicationService procedimentoApplication)
        {
            _procedimentoApplication = procedimentoApplication;
        }

        public ActionResult Index()
        {
            ViewBag.Title = "Procedimento";
            IList<ProcedimentoViewModel> lst = null;
            lst = _procedimentoApplication.GetAll().ToList<ProcedimentoViewModel>();

            if (TempData["Mensagem"] != null)
            {
                ViewBag.Mensagem = TempData["Mensagem"] as Mensagem;
            }

            return View(lst);
        }

        public ActionResult Create()
        {
            ViewBag.Title = "Inserir procedimento";

            ProcedimentoViewModel model = new ProcedimentoViewModel()
            {
                ListaSituacoes = EnumUtil.GetEnumSelectList<SituacaoEnum>(1)
            };

            return View("CreateEdit", model);
        }

        [HttpPost]
        public ActionResult Create(ProcedimentoViewModel model)
        {
            Mensagem msg = null;
            bool isValid = true;
            try
            {
                if (ModelState.IsValid)
                {

                    if (!string.IsNullOrEmpty(model.CodigoProcedimento))
                    {
                        if (_procedimentoApplication.GetByCodigo(model.CodigoProcedimento) != null)
                        {
                            msg = new Mensagem()
                            {
                                Conteudo = "Já existe um procedimento cadastrado com esse código",
                                tipoMensagem = TipoMensagem.ATENCAO
                            };

                            isValid = false;
                        }
                    }

                    if (isValid)
                    {
                        _procedimentoApplication.Create(model);
                        msg = new Mensagem()
                        {
                            Conteudo = "Procedimento cadastrado com sucesso",
                            tipoMensagem = TipoMensagem.SUCESSO
                        };
                    }


                    TempData["Mensagem"] = msg;
                }

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                msg = new Mensagem()
                {
                    Conteudo = string.Concat("Erro ao salvar procedimento. Detalhes: ", ex.Message),
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }

        public ActionResult Edit(int id)
        {
            try
            {
                ViewBag.Title = "Alterar procedimento";
                ProcedimentoViewModel model = null;
                model = _procedimentoApplication.GetById(id);
                model.ListaSituacoes = EnumUtil.GetEnumSelectList<SituacaoEnum>(1);
                return View("CreateEdit", model);
            }
            catch (Exception)
            {
                Mensagem msg = new Mensagem()
                {
                    Conteudo = "Não foi possível carregar o procedimento",
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }

        }

        [HttpPost]
        public ActionResult Edit(ProcedimentoViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    _procedimentoApplication.Update(model);

                    Mensagem msg = new Mensagem()
                    {
                        Conteudo = "Procedimento alterado com sucesso",
                        tipoMensagem = TipoMensagem.SUCESSO
                    };

                    TempData["Mensagem"] = msg;
                }

                return RedirectToAction("Index");
            }
            catch
            {
                Mensagem msg = new Mensagem()
                {
                    Conteudo = "Erro ao alterar procedimento",
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }

        [HttpPost]
        public ActionResult Delete(int id)
        {
            Mensagem msg = null;

            try
            {
                ProcedimentoViewModel procedimento = _procedimentoApplication.GetById(id);
                _procedimentoApplication.Delete(procedimento);

                msg = new Mensagem()
                {
                    Conteudo = "Procedimento excluído com sucesso",
                    tipoMensagem = TipoMensagem.SUCESSO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                msg = new Mensagem()
                {
                    Conteudo = string.Concat("Erro ao excluir procedimento. Detalhes: ", ex.Message),
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }
    }
}
